<?php

namespace App\Http\Controllers\home\seller;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use DB;
class GoodsController extends Controller
{
    /**
    *  卖家中心 商品列表页面
    */
    public function getIndex(Request $request)
    {
        // 查询数据库的数据 进行分页展示
        $data = DB::table('goods_basis') 
        -> where('goodsname','like','%'.$request -> input('search','').'%')
        -> where('username','=',session('homeusername'))
        -> orderBy('status','asc')
        -> orderBy($request -> input('n','id'),'desc')

        -> paginate($request -> input('DataTables_Table_0_length' , 5));

        // 查询商品总件数
        $num =  DB::table('goods_basis') -> where('username','=',session('homeusername')) -> where('goodsname','like','%'.$request -> input('search','').'%') -> count();

        // 加载模板 并且传数据
        return view('home.seller.goods.index',['data' => $data,'num'=>$num,'request' => $request -> all()]);
    }

    /**
    *  卖家中心 商品添加页面
    */
    public function getAdd()
    {
        // 获取当前登录用户的用户名
        $username = session('homeusername');

        // 当前登录者的店铺信息
        $data1 = DB::table('examine') -> where('username','=',$username) -> first();

        // 查询当前店铺类型在一级分类表中的信息
        $data2 = DB::table('y_classified_one') -> where('classname','=',$data1['type']) -> first();

        // 查询一级分类下所有的二级分类
        $data3 = DB::table('y_classified_two') -> where('pid','=',$data2['id']) -> get();
        
        // 将三级分类压入到二级分类中
        $arr = [];
        foreach($data3 as $k => $v){
            $v['sub'] = DB::table('y_classified_three') -> where('pid','=',$v['id']) -> get();
            $arr[] = $v;
        }

        // 加载模板 并且传数据
        return view('home.seller.goods.add',['arr'=>$arr]);
    }

    /**
    *  卖家中心 商品添加操作
    */
    public function postInsert(Request $request)
    {
        // 自动验证表单
        $this -> validate($request,[
            'goodsname' => 'required',
            'details' => 'required',
            'title' => 'required',
            'price' => 'required|integer',
            'inventory' => 'required|integer',
            'attrbute_key1' => 'required',
            'attrbute_val1' => 'required',
            'classname' => 'required',
            'picture' => 'required',
            'content' => 'required',
        ],[
            'goodsname.required' => '商品标题不能为空',
            'details.required' => '商品详情不能为空',
            'title.required' => '商品名称不能为空',
            'price.required' => '商品价格不能为空',
            'price.integer' => '商品价格必须为整数',
            'inventory.required' => '商品数量不能为空',
            'inventory.integer' => '商品数量必须为整数',
            'attrbute_key1.required' => '商品属性不能为空',
            'attrbute_val1.required' => '商品属性值不能为空',
            'classname.required' => '商品分类不能为空',
            'picture.required' => '商品头像不能为空',
            'content.required' => '商品详情图不能为空',
        ]);

        // 判断图片上传
        if ($request->hasFile('picture')) {
            // 获取图片后缀
            $suffix = $request -> file('picture') -> getClientOriginalExtension();

            //设置图片名称 
            $name = date('YmdHis',time());

            // 图片上传的路径
            $path = '/goodsupload/goodsPhoto/'.time().'/';

            // 判断图片后缀名
            $img = ['jpg','png','gif','jpeg'];
            if (in_array($suffix,$img)) {
                $request -> file('picture') -> move('.'.$path,$name.'.'.$suffix);
            }else{
               return back() -> with('error','文件格式不正确');
            }
        } 

        // 获取商品添加页面提交的数据
        $arr = $request -> except('_token');
        
        // 查询添加商品的三级分类
        $data3 = DB::table('y_classified_three') -> where('classname','=',$arr['classname']) -> first();
        $data2 = DB::table('y_classified_two') -> where('id','=',$data3['pid']) -> first();
        $data1 = DB::table('y_classified_one') -> where('id','=',$data2['pid']) -> first();
        
        // 商品详情图保存的路径
        $imgpath = explode('src="', $arr['content']);
    
        array_shift($imgpath);
    
        $preg = "/(.*)\".*style/";
        
        foreach ($imgpath as $k => $v) {
            preg_match_all($preg, $v, $res[]);
        }
        
        if (empty($res[0][1][0]) || empty($res[1][1][0]) || empty($res[2][1][0]) || empty($res[3][1][0]) || empty($res[4][1][0])) {
            return back() -> with('error','商品详情图必须上传5张');
        }

        // 商品基础表数据
        $goods_array1 = ['goodsname'=>$arr['goodsname'],'price'=>$arr['price'],'class1'=>$data1['id'],'class2'=>$data2['id'],'class3'=>$data3['id'],'ctime'=>time(),'picture'=>$path.$name.'.'.$suffix,'inventory'=>$arr['inventory'],'username'=>session('homeusername')];
        
        // 将数据插入到数据表
        $Gid = DB::table('goods_basis') -> insertGetId($goods_array1);

        if ($Gid) {

            // 获取商品所在店铺的信息
            $reg = DB::table('examine') -> where('username','=',session('homeusername')) -> first();

            // 拼接商品的属性和属性值
            $shu = $request -> input('attrbute_key1','').':'.$request -> input('attrbute_val1','').'<br/>'.$request -> input('attrbute_key2','').':'.$request -> input('attrbute_val2','').'<br/>'.$request -> input('attrbute_key3','').':'.$request -> input('attrbute_val3','').'<br/>'.$request -> input('attrbute_key4','').':'.$request -> input('attrbute_val4','').'<br/>'.$request -> input('attrbute_key5','').':'.$request -> input('attrbute_val5','');  

            // 商品详情表的数据
            $goods_array2 = ['gid'=>$Gid,'details'=>$arr['details'],'shopid'=>$reg['id'],'shop'=>$reg['name'],'image1'=>$res[0][1][0],'image2'=>$res[1][1][0],'image3'=>$res[2][1][0],'image4'=>$res[3][1][0],'image5'=>$res[4][1][0],'attrbute'=>$shu,'title'=>$arr['title']];
            
            // 将数据插入到数据表
            $res2 = DB::table('goods_details') -> insert($goods_array2);

            if ($res2) {
                return redirect('/home/seller/goods/index') -> with('success','商品添加成功');
            } else {
                return back() -> with('error','商品添加失败');
            }
           
        } else {
            return back() -> with('error','商品添加失败');
        }
    }

    // 卖家中心 商品删除 
    public function getDelete(Request $request)
    {
        // 获取要删除的商品的ID
        $id = $request -> input('id');
       
        // 查询要删除的商品信息 (用于删除头像)
        $arr = DB::table('goods_basis') -> where('id','=',$id) -> first();

        // 删除基础表信息
        $res = DB::table('goods_basis') -> where('id','=',$id) -> delete();

        // 判断删除结果
        if ($res>0) {
            
            // 删除商品头像的图片（服务器）
            if(file_exists('.'.$arr['picture'])) {
                unlink('.'.$arr['picture']);
            }
            // 查询要删除的商品的详情表的信息
            $data1 = DB::table('goods_details') -> where('gid','=',$id) -> select('image1','image2','image3','image4','image5') ->first();

            // 删除商品详情表的信息
            $res2 = DB::table('goods_details') -> where('gid','=',$id) -> delete();

            if ($res2 > 0) {
                // 遍历删除商品详情图（服务器）
                foreach ($data1 as $key => $value) {
                   
                     if ( file_exists('.'.$value) && $value != null ) {
                        unlink('.'.$value);
                     }
                 }
            }

            // 删除没有图片的空目录
            self::reDir('./goodsupload/goodsPhoto');

            // 查询删除的商品评论的信息的ID
            $Eid = DB::table('evaluate') -> where('gid','=',$id) -> select('id') -> get();

            // 删除商品评论表的信息
            $res3 = DB::table('evaluate') -> where('gid','=',$id) -> delete();

            // 删除评论回复表的信息
            $res4 = DB::table('to_evaluate') -> whereIn('pid',$Eid) -> delete();
            
            return redirect('/home/seller/goods/index') -> with('success','删除成功');

        } else {
            return back() -> with('error','删除失败');
        }

    }

    /**
    *   清空空的目录
    */
    static function reDir($path) {
     
        if(is_dir($path) && ($handle = opendir($path))!==false){  
       // 遍历文件夹
        while(($file=readdir($handle))!==false){   
            // 当前目录
            if($file!='.' && $file!='..'){  
                 // 目录
                $curfile = $path.'/'.$file;  
                 // 如果是目录则继续遍历         
                if(is_dir($curfile)){   

                    self::reDir($curfile);   
                    // 目录为空,=2是因为. 和 ..存在
                    if(count(scandir($curfile))==2){
                        // 删除空目录
                        rmdir($curfile);               
                    }  
                }  
            }  
        }  
        closedir($handle);  
        }  
    }

    /**
    *   商品详细信息
    */
    public function getGdetail(Request $request)
    {
        // 接受数据ID
        $id = $request -> input('id');

        // 商品基础表的信息
        $data1 = DB::table('goods_basis') -> where('id','=',$id) ->first();

        // 查询商品的一级分类
        $array1 = DB::table('y_classified_one') -> where('id','=',$data1['class1']) ->select('classname') ->first();

        // 查询商品的二级分类
        $array2 = DB::table('y_classified_two') -> where('id','=',$data1['class2']) ->select('classname') ->first();

        // 查询商品的三级分类
        $array3 = DB::table('y_classified_three') -> where('id','=',$data1['class3']) ->select('classname') ->first();

        // 商品详情表的信息
        $data2 = DB::table('goods_details') -> where('gid','=',$data1['id']) -> first();

        $num = DB::table('evaluate') -> where('gid','=',$id) -> count();

        return view('home.seller.goods.gdetail',['data2'=>$data2,'class1'=>$array1['classname'],'class2'=>$array2['classname'],'class3'=>$array3['classname'],'num'=>$num]);
    }

    /**
    *   修改出售状态(上架和下架)
    */
    public function getStatus(Request $request)
    {
        // 接受数据
        $arr = $request -> all();

        // 修改数据库里的数据
        $res = DB::table('goods_basis') -> where('id','=',$arr['id']) -> update(['status'=>$arr['status']]);

        // 判断返回的影响行数 把操作的结果压入session
        if ($arr['status'] == 1) {
            if ($res > 0) {
                return redirect('/home/seller/goods/index') -> with('success','下架成功');
            } else {
                return back() -> with('error','下架失败');
            }
        } else {
            if ($res > 0) {
                return redirect('/home/seller/goods/index') -> with('success','上架成功');
            } else {
                return back() -> with('error','上架失败');
            }
        } 
    }

    /**
    *   修改商品信息的页面
    */
    public function getEdit(Request $request)
    {
        // 接受数据ID
        $id = $request -> input('id');

        // 商品基础表的信息
        $data1 = DB::table('goods_basis') -> where('id','=',$id) ->first();

        // 查询商品的一级分类
        $array1 = DB::table('y_classified_one') -> where('id','=',$data1['class1']) ->select('classname') ->first();

        // 查询商品的二级分类
        $array2 = DB::table('y_classified_two') -> where('id','=',$data1['class2']) ->select('classname') ->first();

        // 查询商品的三级分类
        $array3 = DB::table('y_classified_three') -> where('id','=',$data1['class3']) ->select('classname') ->first();

        // 拼接商品的分类
        $classname = $array1['classname'].'-'.$array2['classname'].'-'.$array3['classname'];

        // 商品详情表的信息
        $data2 = DB::table('goods_details') -> where('gid','=',$data1['id']) -> first();

        $a = explode('<br/>',$data2['attrbute']);

        // 切割属性
        foreach($a as $k=>$v){
            $b[] = explode(':',$v);
        }
        
        return view('home.seller.goods.edit',['data1'=>$data1,'data2'=>$data2,'b'=>$b,'classname'=>$classname]);
    }

    /**
    *   卖家中心 商品信息修改
    */
    public function postUpdate(Request $request)
    {
        // 自动验证表单
        $this -> validate($request,[
            'goodsname' => 'required',
            'details' => 'required',
            'title' => 'required',
            'price' => 'required|integer',
            'inventory' => 'required|integer',
            'attrbute_key1' => 'required',
            'attrbute_val1' => 'required',
        ],[
            'goodsname.required' => '商品标题不能为空',
            'details.required' => '商品详情不能为空',
            'title.required' => '商品名称不能为空',
            'price.required' => '商品价格不能为空',
            'price.integer' => '商品价格必须为整数',
            'inventory.required' => '商品数量不能为空',
            'inventory.integer' => '商品数量必须为整数',
            'attrbute_key1.required' => '商品属性不能为空',
            'attrbute_val1.required' => '商品属性值不能为空',
        ]);

        // 接受修改的数据
        $arr = $request -> except('_token');

        // 修改的商品基础表数据
        $goods_array1 = ['goodsname'=>$arr['goodsname'],'price'=>$arr['price'],'inventory'=>$arr['inventory']];

        // 判断图片上传
        if ($request->hasFile('picture')) {
            // 获取图片后缀
            $suffix = $request -> file('picture') -> getClientOriginalExtension();

            //设置图片名称 
            $name = date('YmdHis',time());

            // 图片上传的路径
            $path = '/goodsupload/goodsPhoto/'.time().'/';
            
            // 判断图片后缀名
            $img = ['jpg','png','gif','jpeg'];
            if (in_array($suffix,$img)) {
                
                $request -> file('picture') -> move('.'.$path,$name.'.'.$suffix);
                $goods_array1['picture'] = $path.$name.'.'.$suffix;

                

            }else{
               return back() -> with('error','文件格式不正确');
            }
        } 
        
        // 查询原来头像的路径
        $imgs = DB::table('goods_basis') -> where('id','=',$arr['id']) -> first();
        
        // 修改商品基础表的信息
        $res1 = DB::table('goods_basis') -> where('id','=',$arr['id']) -> update($goods_array1);

        // 拼接商品的属性和属性值
        $shu = $request -> input('attrbute_key1','').':'.$request -> input('attrbute_val1','').'<br/>'.$request -> input('attrbute_key2','').':'.$request -> input('attrbute_val2','').'<br/>'.$request -> input('attrbute_key3','').':'.$request -> input('attrbute_val3','').'<br/>'.$request -> input('attrbute_key4','').':'.$request -> input('attrbute_val4','').'<br/>'.$request -> input('attrbute_key5','').':'.$request -> input('attrbute_val5','');

        // 商品详情表修改的数据
        $goods_array2 = ['details'=>$arr['details'],'attrbute'=>$shu,'title'=>$arr['title']];

        if (!empty($arr['content'])) {
            // 商品详情图保存的路径
            $imgpath = explode('src="', $arr['content']);
        
            array_shift($imgpath);
        
            $preg = "/(.*)\".*style/";
            
            foreach ($imgpath as $k => $v) {
                preg_match_all($preg, $v, $res[]);
            }
            
            if (empty($res[0][1][0]) || empty($res[1][1][0]) || empty($res[2][1][0]) || empty($res[3][1][0]) || empty($res[4][1][0])) {
                return back() -> with('error','商品详情图必须上传5张');
            }

            // 修改商品详情图的数据
            $goods_array2['image1'] = $res[0][1][0];
            $goods_array2['image2'] = $res[1][1][0];
            $goods_array2['image3'] = $res[2][1][0];
            $goods_array2['image4'] = $res[3][1][0];
            $goods_array2['image5'] = $res[4][1][0];
        }

        // 查询原来头像的路径
        $imgs2 = DB::table('goods_details') -> where('gid','=',$arr['id']) -> select('image1','image2','image3','image4','image5') -> first();

        // 修改商品详情表的数据
        $res2 = DB::table('goods_details') -> where('gid','=',$arr['id']) -> update($goods_array2);

        if ($res1 <= 0 && $res2 <= 0) {
            return back() -> with('error','修改失败');
        }
        
        // 删除修改之前的图片（头像）
        if ($request->hasFile('picture')) {
            if ($res1 > 0) {
                if ( file_exists('.'.$imgs['picture'])) {
                    unlink('.'.$imgs['picture']);
                }
            }
        }

        if (!empty($arr['content'])) {
            if ($res2 > 0) {
                // 遍历删除商品详情图（服务器）
                foreach ($imgs2 as $key => $value) {
                   
                     if ( file_exists('.'.$value) && $value != null ) {
                        unlink('.'.$value);
                     }
                 }
            }
        }
        // 删除没有图片的空目录
        self::reDir('./goodsupload/goodsPhoto');

        return redirect('/home/seller/goods/index') -> with('success','修改成功');    
    }


    /**
    *   卖家中心 商品评论
    */
    public function getEvaluate(Request $request)
    {
        // 商品的ID
        $gid = $request -> input('gid');

        // 接受搜索的关键字
        $search = $request -> input('search','');
       
        // 接受每页显示的条数
        $count = $request -> input('count',10);

        // 查询商品的所有一级评论
        $data = DB::table('evaluate') -> where('gid','=',$gid) -> where('status','=',0) -> where('content','like','%'.$search.'%') -> orderBy('ctime','desc')  -> paginate($count);

        $num = DB::table('evaluate') -> where('gid','=',$gid) -> where('status','=',0) -> where('content','like','%'.$search.'%') -> count();

        return view('home.seller.goods.evaluate',['data'=>$data,'request'=>$request -> all(),'gid'=>$gid,'num'=>$num]);
    }


    /**
    *   卖家中心 查看回帖并回复
    */
    public function getEvaldetail(Request $request)
    {
        // 获取一级评论的ID
        $id = $request -> input('id');

        // 接受搜索的关键字
        $search = $request -> input('search','');
       
        // 接受每页显示的条数
        $count = $request -> input('count',10);

        // 查询回帖表里面的数据
        $data = DB::table('to_evaluate') -> where('pid','=',$id) -> where('status','=',0) -> where('content','like','%'.$search.'%') -> orderBy('ctime','desc')  -> paginate($count);

        $num = DB::table('to_evaluate') -> where('pid','=',$id) -> where('status','=',0)  -> where('content','like','%'.$search.'%') -> count();

        return view('home.seller.goods.evaldetail',['data'=>$data,'id'=>$id,'num'=>$num,'request'=>$request->all()]);
    }


    /**
    *   评论回复
    */
    public function postInserteval(Request $request)
    {
        // 自动验证表单
        $this -> validate($request,[
            'content' => 'required',
        ],[
            'content.required' => '回复的内容不能为空',

        ]);

        // 接收数据
        $id = $request -> input('id');
        $content = trim($request -> input('content'));

        $array = DB::table('user') -> where('username','=',session('homeusername')) -> first();

        // 插入的数据
        $arr = ['pid'=>$id,'uid'=>$array['id'],'writer'=>$array['username'],'ctime'=>time(),'content'=>$content];
        $res = DB::table('to_evaluate') ->insert($arr);

        if ($res) {
            return redirect('/home/seller/goods/evaldetail?id='.$id) -> with('success','回复成功');
        } else {
            return back() -> with('error','回复失败');
        }
    }
}
